/*
 * Main.fx
 *
 * Created on 08.05.2010, 15:51:25
 */

package javafxapplication3;

import javafx.stage.Stage;
import javafx.scene.text.Text;
import javafx.scene.text.Font;
import javafx.ext.swing.SwingTextField;
import javafx.ext.swing.SwingLabel;
import javafx.scene.layout.VBox;
import javafx.scene.layout.HBox;
import java.lang.*;
import javafx.ext.swing.SwingButton;
import javafx.scene.shape.*;
import javafx.scene.effect.*;
import javafx.scene.effect.light.*;
import javafx.scene.*;
import javafx.scene.input.*;
import javafx.scene.paint.*;
import javafx.scene.shape.*;

var present:String[];
present = for (i in [1 .. 70]) "";
var presentUser:String[];
presentUser = for (i in [1 .. 70]) "";
var counter:Integer; //
var counterUser:Integer; //
var Rg:Integer;
var Gg:Integer;
var Bg:Integer;
var Rc:Integer;
var Gc:Integer;
var Bc:Integer;
var RInitial:Integer;
var GInitial:Integer;
var BInitial:Integer;
var str:String;
var ToolTipText:String;
ToolTipText = " ";
//ОБЛАСТИ ОТОБРАжЕНИЯ ЗНАЧЕНИЙ
var ResultAreaUser = Group{
    onMouseEntered: function(event:MouseEvent) {
                    ToolTipText = "Комбинации составленные пользователем"
                }
    onMouseExited: function(event:MouseEvent) {
                    ToolTipText = ""
                }
    };
var ResultAreaComputer = Group{
    onMouseEntered: function(event:MouseEvent) {
                    ToolTipText = "Комбинации составленные комптютером"
                }
    onMouseExited: function(event:MouseEvent) {
                    ToolTipText = ""
                }
    };
var CanvasUser = Group{};
var CanvasComputer = Group{};
//ПРОВЕРКА УНИКАЛЬНОСТИ ВАРИАНТА КОМПЬЮТЕРА
function Check(str:String):Integer
{   
    for(nu in [0..100])
    {   if(present[nu] == str)
        {
            return 1;
        }
    }
    return 0;
}
//ПРОВЕРКА УНИКАЛЬНОСТИ ВАРИАНТА ПОЛЬЗОВАТЕЛЯ
function CheckUser(str:String):Integer
{   
    for(nu in [0..100])
    {   if(presentUser[nu] == str)
        {   
            return 1;
        }
    }
    return 0;
}


function Calculate(r:Integer,g:Integer,b:Integer)
{
    var X:Integer;
    delete CanvasComputer from ResultAreaComputer.content;
    CanvasComputer = Group{}
    insert CanvasComputer into ResultAreaComputer.content;
    for(n in [0..counter])
            present[n]="";
    var str:String;
    var porR:Integer;
    var porB:Integer;
    var porG:Integer;
    var por:Integer;
    var R:Integer;
    var B:Integer;
    var G:Integer;
    var S:String;
    R=r;B=b;G=g;
    counter=1;
    if(r>0) porR=1
    else porR=0;
    if(b>0) porB=1
    else porB=0;
    if(g>0) porG=1
    else porG=0;
    if(G+R+B>0) por=1
    else {
    por=0;
    return 0;
    }
    var time:Integer;// Отвечает что мы сейчас добавляем R G или B
    time=1;
    var num:Integer;
    num=0;
    porR=0;
    porG=0;
    porB=0;
    while(true)
    {
      if(R+B+G>=por)
      {
         if(time==1)
      {     
            if(R-porR>0)
            {   
                if(num+1==por)
                 {  
                        S=str;
                        S+="R";
                        //ДОБАВЛЯЕМ К ОТОБРАЖЕНИЮ
                        var elem = Rectangle {
                                    x: 30 * X   y: 25 * counter
                                    width: 20  height: 20
                                    fill: Color.RED
                                    effect: Lighting {
                                                     light: DistantLight {
                                                                         azimuth: 300
                                                                         }
                                                     surfaceScale: 6
                                                     }
                             }
                        X++;
                        insert elem into CanvasComputer.content;
                        if(Check(S)==1)
                        {
                            time++;
                            continue;
                        }
                        else
                        {
                            porR++;
                            num=0;
                            present[counter]=S;
                            counter++;
                            R-=porR;
                            B-=porB;
                            G-=porG;
                            porR=0;
                            porG=0;
                            porB=0;
                            str="";
                            X = 0;
                        }
                    }
            else
            {   
                //ДОБАВЛЯЕМ К ОТОБРАЖЕНИЮ
                var elem = Rectangle {
                                        x: 30 * X   y: 25 * counter
                                        width: 20  height: 20
                                        fill: Color.RED
                                        effect: Lighting {
                                                         light: DistantLight {
                                                                             azimuth: 300
                                                                             }
                                                         surfaceScale: 6
                                                         }
                                 }
                X++;
                insert elem into CanvasComputer.content;
                str+="R";
                porR++;
                num++;
                continue;
            }
        }
        else
        {
          time++;
          continue;
        }
      }
      else
      { if(time==2)
        { 
            if(G-porG>0)
            {  
                if(num+1==por)
                {   
                    S=str;
                    S+="G";
                    //ДОБАВЛЯЕМ К ОТОБРАЖЕНИЮ
                    var elem = Rectangle {
                                            x: 30 * X   y: 25 * counter
                                            width: 20  height: 20
                                            fill: Color.GREEN
                                            effect: Lighting {
                                                             light: DistantLight {
                                                                                 azimuth: 300
                                                                                 }
                                                             surfaceScale: 6
                                                             }
                                     }
                    X++;
                    insert elem into CanvasComputer.content;
                    if(Check(S)==1)
                    {   
                        time++;
                        continue;
                    }
                    else
                    {  
                        porG++;
                        num=0;
                        present[counter]=S;
                        counter++;
                        R-=porR;
                        B-=porB;
                        G-=porG;
                        porR=0;
                        porG=0;
                        porB=0;
                        str="";
                        X = 0;
                    }
                }
                else
                {
                    //ДОБАВЛЯЕМ К ОТОБРАЖЕНИЮ
                    var elem = Rectangle {
                                            x: 30 * X   y: 25 * counter
                                            width: 20  height: 20
                                            fill: Color.GREEN
                                            effect: Lighting {
                                                             light: DistantLight {
                                                                                 azimuth: 300
                                                                                 }
                                                             surfaceScale: 6
                                                             }
                                     }
                    X++;
                    insert elem into CanvasComputer.content;
                    str+="G";
                    porG++;
                    num++;
                    continue;
                }
            }
            else
            { 
              time++;
              continue;
            }
        }
        else//time=3
        { 
            if(B-porB>0)
            {   
                if(num+1==por)
                {   
                    S=str;
                    S+="B";
                    //ДОБАВЛЯЕМ К ОТОБРАЖЕНИЮ
                    var elem = Rectangle {
                                            x: 30 * X   y: 25 * counter
                                            width: 20  height: 20
                                            fill: Color.BLUE
                                            effect: Lighting {
                                                             light: DistantLight {
                                                                                 azimuth: 300
                                                                                 }
                                                             surfaceScale: 6
                                                             }
                                     }
                    X++;
                    insert elem into CanvasComputer.content;
                    if(Check(S)==1)
                    {   
                        time=1;
                        por++;
                        num=0;
                        porR=0;
                        porG=0;
                        porB=0;
                        str="";
                        continue;
                    }
                    else
                    {  
                        porB++;
                        num=0;
                        present[counter]=S;
                        counter++;
                        R-=porR;
                        B-=porB;
                        G-=porG;
                        porR=0;
                        porG=0;
                        porB=0;
                        str="";
                        X = 0;
                    }
                }
                else
                {
                    //ДОБАВЛЯЕМ К ОТОБРАЖЕНИЮ
                    var elem = Rectangle {
                                            x: 30 * X   y: 25 * counter
                                            width: 20  height: 20
                                            fill: Color.BLUE
                                            effect: Lighting {
                                                             light: DistantLight {
                                                                                 azimuth: 300
                                                                                 }
                                                             surfaceScale: 6
                                                             }
                                     }
                    X++;
                    insert elem into CanvasComputer.content;
                    str+="B";
                    porB++;
                    num++;
                    continue;
                }
            }
            else
            { 
              time=1;
              por++;
              porR=0;
              porG=0;
              porB=0;
              num=0;
              str="";
              continue;
            }
        }
      }
      }
      else
        break;
    }
    return 1;
}

def RTextBox = SwingTextField { columns: 10
    onMouseEntered: function(event:MouseEvent) {
                    ToolTipText = "Кол-во оставшихся красных платков"
                }
    onMouseExited: function(event:MouseEvent) {
                    ToolTipText = ""
                }
	text: "0"
	editable: true }
def GTextBox = SwingTextField { columns: 10
    onMouseEntered: function(event:MouseEvent) {
                    ToolTipText = "Кол-во оставшихся зеленых платков"
                }
    onMouseExited: function(event:MouseEvent) {
                    ToolTipText = ""
                }
	text: "0"
	editable: true }
def BTextBox = SwingTextField { columns: 10
    onMouseEntered: function(event:MouseEvent) {
                    ToolTipText = "Кол-во оставшихся синих платков"
                }
    onMouseExited: function(event:MouseEvent) {
                    ToolTipText = ""
                }
	text: "0"
	editable: true }
def LabelResult =  SwingLabel {text: "Результат"}
def LabelR = SwingLabel {
    text: "0"
    onMouseEntered: function(event:MouseEvent) {
                    ToolTipText = "Кол-во выбранных красных платков"
                }
    onMouseExited: function(event:MouseEvent) {
                    ToolTipText = ""
                }
}
def LabelG = SwingLabel {
    text: "0"
    onMouseEntered: function(event:MouseEvent) {
                    ToolTipText = "Кол-во выбранных зеленых платков"
                }
    onMouseExited: function(event:MouseEvent) {
                    ToolTipText = ""
                }
    }
def LabelB = SwingLabel {
    text: "0"
    onMouseEntered: function(event:MouseEvent) {
                    ToolTipText = "Кол-во выбранных синих платков"
                }
    onMouseExited: function(event:MouseEvent) {
                    ToolTipText = ""
                }
    }

def AddButton = SwingButton {
    onMouseEntered: function(event:MouseEvent) {
                    ToolTipText = "Добавить выбранную комбинацию к отображению"
                }
    onMouseExited: function(event:MouseEvent) {
                    ToolTipText = ""
                }
	text: "Добавить в набор"
	action: function() {
                str="";
                for(n in [1..Rc])
                    str+="R";
                for(n in [1..Gc])
                    str+="G";
                for(n in [1..Bc])
                    str+="B";
                if(CheckUser(str)==1)//Вывод сообщения о том,что уже есть такой в наборе.
                {  Rg+=Rc;
                   Rc=0;
                   Gg+=Gc;
                   Gc=0;
                   Bg+=Bc;
                   Bc=0;
                   RTextBox.text=String.valueOf(Rg);
                   LabelR.text=String.valueOf(Rc);
                   GTextBox.text=String.valueOf(Gg);
                   LabelG.text=String.valueOf(Gc);
                   BTextBox.text=String.valueOf(Bg);
                   LabelB.text=String.valueOf(Bc);
                   Stage
                   {    title : "Ньюанс!!11"
                        scene: Scene
                               {    width: 250
                                    height: 60
                                    content:
                                    [   Text
                                        {   font : Font{size: 12}
                                            x: 10, y: 30
                                            content: "Такой варинт уже существует в наборе!"
                                        }
                                    ]
                                }
                    }

                }
                else
                {   presentUser[counterUser]=str;
                    counterUser++;
                    //ОТОБРАЖАЕМ  ГРАФИЧЕСКИ
                    //КРАСНЫЕ
                    for(n in [1..Rc])
                    {
                        var elem = Rectangle {
                                    x: 30 * n  y: 25 * counterUser
                                    width: 20  height: 20
                                    fill: Color.RED
                                    effect: Lighting {
                                                     light: DistantLight {
                                                                         azimuth: 300
                                                                         }
                                                     surfaceScale: 6
                                                     }
                             }
                        insert elem into CanvasUser.content;
                        }
                    //ЗЕЛЕНЫЕ
                    for(n in [1..Gc])
                    {
                        var elem = Rectangle {
                                    x: 30 * n + (Rc * 30) y: 25 * counterUser
                                    width: 20  height: 20
                                    fill: Color.GREEN
                                    effect: Lighting {
                                                     light: DistantLight {
                                                                         azimuth: 300
                                                                         }
                                                     surfaceScale: 6
                                                     }
                                }
                        insert elem into CanvasUser.content;
                        }
                    //СИНИЕ
                    for(n in [1..Bc])
                    {
                        var elem = Rectangle {
                                    x: 30 * n + (Rc * 30) + (Gc * 30)  y: 25 * counterUser
                                    width: 20  height: 20
                                    fill: Color.BLUE
                                    effect: Lighting {
                                                     light: DistantLight {
                                                                         azimuth: 300
                                                                         }
                                                     surfaceScale: 6
                                                     }
                                }
                        insert elem into CanvasUser.content;
                        }
                    //ОЧИСТКА ЗНАЧЕНИЙ
                    Rc=0;
                    Gc=0;
                    Bc=0;
                    RTextBox.text=String.valueOf(Rg);
                    LabelR.text=String.valueOf(Rc);
                    GTextBox.text=String.valueOf(Gg);
                    LabelG.text=String.valueOf(Gc);
                    BTextBox.text=String.valueOf(Bg);
                    LabelB.text=String.valueOf(Bc);
                    //ЕСЛИ ОСТАТОК ВСЕХ ТИПОВ ПЛАТКОВ РАВЕН 0 - ВЫВОДИМ СООБЩЕНИЕ О ТОМ ЧТО ИГРА ОКОНЧЕНА
                    if(Rg == 0 and Gg == 0 and Bg == 0)
                    {
                            Stage
                           {    title : "%username% ЛИКУЕТ!!11"
                                scene: Scene
                                       {    width: 250
                                            height: 60
                                            content:
                                            [   Text
                                                {   font : Font{size: 12}
                                                    x: 10, y: 30
                                                    content: "ИГРА ЗАКОНЧИЛАСЬ РЕАЛЬНЕ!!!!11111"
                                                }
                                            ]
                                        }
                            }
                        }
                }
	}
}
def incR = SwingButton {
	text: "+"
    onMouseEntered: function(event:MouseEvent) {
                    ToolTipText = "Увеличить кол-во красных платков в наборе"
                }
    onMouseExited: function(event:MouseEvent) {
                    ToolTipText = ""
                }
	action: function() {
                if(Rg>0)
                {   Rg--;
                    Rc++;
                    RTextBox.text=String.valueOf(Rg);
                    LabelR.text=String.valueOf(Rc);
                }
	}
}
def decR = SwingButton {
	text: "-"
    onMouseEntered: function(event:MouseEvent) {
                    ToolTipText = "Уменьшить кол-во красных платков в наборе"
                }
    onMouseExited: function(event:MouseEvent) {
                    ToolTipText = ""
                }
	action: function() {
                if(Rc>0)
                {   Rc--;
                    Rg++;
                    RTextBox.text=String.valueOf(Rg);
                    LabelR.text=String.valueOf(Rc);
                }
	}
}
def incG = SwingButton {
	text: "+"
    onMouseEntered: function(event:MouseEvent) {
                    ToolTipText = "Увеличить кол-во зеленых платков в наборе"
                }
    onMouseExited: function(event:MouseEvent) {
                    ToolTipText = ""
                }
	action: function() {
                if(Gg>0)
                {   Gg--;
                    Gc++;
                    GTextBox.text=String.valueOf(Gg);
                    LabelG.text=String.valueOf(Gc);
                }
	}
}
def decG = SwingButton {
	text: "-"
    onMouseEntered: function(event:MouseEvent) {
                    ToolTipText = "Уменьшить кол-во зеленых платков в наборе"
                }
    onMouseExited: function(event:MouseEvent) {
                    ToolTipText = ""
                }
	action: function() {
                if(Gc>0)
                {   Gc--;
                    Gg++;
                    GTextBox.text=String.valueOf(Gg);
                    LabelG.text=String.valueOf(Gc);
                }
	}
}
def incB = SwingButton {
	text: "+"
    onMouseEntered: function(event:MouseEvent) {
                    ToolTipText = "Увеличить кол-во синих платков в наборе"
                }
    onMouseExited: function(event:MouseEvent) {
                    ToolTipText = ""
                }
	action: function() {
                if(Bg>0)
                {   Bg--;
                    Bc++;
                    BTextBox.text=String.valueOf(Bg);
                    LabelB.text=String.valueOf(Bc);
                }
	}
}
def decB = SwingButton {
	text: "-"
    onMouseEntered: function(event:MouseEvent) {
                    ToolTipText = "Уменьшить кол-во синих платков в наборе"
                }
    onMouseExited: function(event:MouseEvent) {
                    ToolTipText = ""
                }
	action: function() {
                if(Bc>0)
                {   Bc--;
                    Bg++;
                    BTextBox.text=String.valueOf(Bg);
                    LabelB.text=String.valueOf(Bc);
                }
	}
}
def ButtonShow = SwingButton {
	text: "Показать вариант компьютера"
    onMouseEntered: function(event:MouseEvent) {
                    ToolTipText = "Отображение варианта, расчитанного компьютером"
                }
    onMouseExited: function(event:MouseEvent) {
                    ToolTipText = ""
                }
	action: function() {
                         Calculate(RInitial,GInitial,BInitial);
                       }
                    }


var SC = Scene {
        width: 510
        height: 800
        content: [
                VBox{ translateX: 0
                        content:
                        [
                    HBox{
                        content:
                        [

                    VBox  {translateX: 40 translateY: 10 spacing: 20
                        content:
                        [
                            HBox {spacing: 5
                                  content: [SwingLabel { translateY: 5
                                                         text: "Красные",
                                                         width:60
                                                        }

                                              RTextBox
                                             ]
                                 }
                            HBox {spacing: 5
                                content: [SwingLabel { translateY: 5
                                                       text: "Зеленые",
                                                       width:60
                                                    }
                                   GTextBox
                                         ]
                                }
                            HBox { spacing: 5
                                content: [
                                            SwingLabel { translateY: 5
                                                        text: "Синие",
                                                        width:60
                                                        }
                                           BTextBox
                                         ]
                                 }
                            HBox {translateY: 0
                                content: [SwingButton {
                                text: "Применить"
                                onMouseEntered: function(event:MouseEvent) {
                                                ToolTipText = "Применить заданные значения и начать игру"
                                            }
                                onMouseExited: function(event:MouseEvent) {
                                                ToolTipText = ""
                }
                                action: function() {
                                                //ПРЕДВАРИТЕЛЬНО ОЧИЩАЕМ ОБЛАСТЬ С РЕЗУЛЬТАТАМИ ПОЛЬЗОВАТЕЛЯ
                                                delete CanvasUser from ResultAreaUser.content;
                                                CanvasUser = Group{}
                                                insert CanvasUser into ResultAreaUser.content;
                                                //ПРЕДВАРИТЕЛЬНО ОЧИЩАЕМ ОБЛАСТЬ С РЕЗУЛЬТАТАМИ КОМПЬЮТЕРА
                                                delete CanvasComputer from ResultAreaComputer.content;
                                                CanvasComputer = Group{}
                                                insert CanvasComputer into ResultAreaComputer.content;
                                                //ПОЛУЧАЕМ ЗНАЧЕНИЯ ИЗ ТЕКСТОВЫХ ПОЛЕЙ
                                                Rg=Integer.parseInt(RTextBox.text);
                                                Gg=Integer.parseInt(GTextBox.text);
                                                Bg=Integer.parseInt(BTextBox.text);
                                                //ЗАПОМИНАЕМ НАЧАЛЬНЫЕ ЗНАЧЕНИЯ
                                                RInitial = Rg;
                                                GInitial = Gg;
                                                BInitial = Bg;
                                                counterUser=0;
                                                Rc=0;Gc=0;Bc=0;
                                                    }
                                                    }
                                        ]
                                    }
                         ]
        }
                 VBox
                        {translateX: 130 translateY: 10 spacing: 20
                            content:
                            [
                        HBox
                        {
                            content:
                            [   VBox
                                {   content:
                                    [   HBox
                                        {   content:
                                            [   SwingLabel { translateY: 5
                                                    text: "Красный",

                                                    width:60
                                                },
                                                incR,
                                                decR,
                                                LabelR
                                                    ]
                                        }

                                    ]
                                }

                            ]
                        }
                        HBox
                        {content:
                            [   VBox
                                {   content:
                                    [   HBox
                                        {   content:
                                            [   SwingLabel { translateY: 5
                                                    text: "Зеленый",
                                                    width:60
                                                },
                                                incG,
                                                decG,
                                                LabelG
                                                    ]
                                        }

                                    ]
                                }

                            ]
                        }
                        HBox
                        {content:
                            [   VBox
                                {   content:
                                    [   HBox
                                        {   content:
                                            [   SwingLabel {  translateY: 5
                                                    text: "Синий",
                                                    width:60
                                                },
                                                incB,
                                                decB,
                                                LabelB
                                                    ]
                                        }

                                    ]
                                }

                            ]
                        }
                         HBox {translateX: 0 spacing: 15
                                content: [
                                            AddButton
                                         ]
                                 }
                        ]}
                        ]
                    }
                    HBox { translateX:250 translateY: 20
                        content: [ButtonShow]
                    }
                    //ОБЛАСТЬ ПОДСКАЗОК
                    HBox { translateX:40 translateY:20
                        content: [SwingLabel {  translateY: 5
                                                width: 300
                                                    text: bind ToolTipText,
                                                      font: Font {
                                                                size: 11
                                                            }
                                                },]
                    }
                    HBox {spacing: 40 translateY: 30 translateX: 40
                        content:[
                            VBox
                                {   content:
                                    [
                                            SwingLabel {
                                                    text: "Вариант пользователя",
                                                    width:150
                                                },
                                            ResultAreaUser
                                    ]
                                }
                            VBox
                                {    translateX: 90
                                    content:
                                    [
                                            SwingLabel {
                                                    text: "Вариант компьютера",
                                                    width:150
                                                },
                                            ResultAreaComputer
                                    ]
                                }
                        ]
                    }

        ]}
]}
Stage {
    title: "Платочки"
    scene: SC
}